package syn;

// 多个线程互相抱着对方需要的资源，然后形成僵持
public class DeadLock {
    public static void main(String[] args) {
        Makeup m1=new Makeup(0,"灰姑娘");
        Makeup m2=new Makeup(1, "白雪公主");
        m1.start();
        m2.start();
    }
}

// 口红
class Lipstick {

}

// 镜子
class Mirror {

}

// 化妆
class Makeup extends Thread {

    // 需要的资源只有一份，用static来保证
    static Lipstick lipstick = new Lipstick();
    static Mirror mirror = new Mirror();

    int choice; //选择
    String name; //使用化妆品的人


    public Makeup(int choice, String name) {
        this.choice = choice;
        this.name = name;
    }

    @Override
    public void run() {
        makeUp();
    }

    // 化妆，互相持有对方的锁，就是需要拿到对方的资源
    private void makeUp(){
        if(choice==0){
            synchronized (lipstick){ // 获得口红的锁
                System.out.println(this.name+"获得口红的锁");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            synchronized (mirror){ // 一秒钟后获得镜子的锁
                System.out.println(this.name+"获得镜子的锁");
            }
        }else{
            synchronized (mirror){ // 获得镜子的锁
                System.out.println(this.name+"获得镜子的锁");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            synchronized (lipstick){ // 一秒钟后获得口红的锁
                System.out.println(this.name+"获得口红的锁");
            }
        }
    }
}